Razvoj softvera - Primeri, čas 2
Saša Malkov
p1_01.io.cpp
#include <iostream>
int main() {
std::cout << "Zdravo\n";
}
p1_02.io.cpp
#include <iostream>
using namespace std;
int main() {
cout << "Zdravo\n";
}
p1_03.io.cpp
#include <iostream>
using namespace std;
int main() {
cout << "Zdravo" << endl;
}
p1_04.io.cpp
#include <iostream>
using namespace std;
unsigned const limit = 100000;
void test1()
{
for( unsigned i=0; i<limit; i++ )
printf( "%d\n", i );
}
void test2()
{
for( unsigned i=0; i<limit; i++ )
cout << i << endl;
}
void test3()
{
for( unsigned i=0; i<limit; i++ )
cout << i << '\n';
}
int main() {
cerr << "test1" << endl;
test1();
cerr << "test2" << endl;
test2();
cerr << "test3" << endl;
test3();
cerr << "test3 a" << endl;
test3();
std::ios::sync_with_stdio(false);
cerr << "end" << endl;
}
p1_05.io.cpp
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
cout << "Upisi dva cela broja" << endl;
int a,b;
cin >> a >> b;
cout << a << " + " << b << " = " << a + b << endl;
}
p1_06.io.cpp
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
cout << "Upisi dva cela broja" << endl;
int a,b;
cin >> a >> b;
ofstream fdat("dat.txt");
fdat << a << " + " << b << " = " << a + b << endl;
}
p1_07.io.cpp
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
cout << "Upisi dva cela broja" << endl;
int a,b;
cin >> a >> b;
ofstream fdat("dat.txt");
fdat << a << " + " << b << " = " << a + b << endl;
ifstream dat2("dat.txt");
char c1,c2;
int c;
dat2 >> a >> c1 >> b >> c2 >> c;
cout << a << c1 << b << c2 << c << endl;
}
p1_08.io.cpp
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
cout << "Upisi dva cela broja" << endl;
int a,b;
cin >> a >> b;
if( !cin ){
if( cin.eof() )
cerr << "Kraj!" << endl;
else
cerr << "Greska!" << endl;
return 1;
}
cout << a << " + " << b << " = " << a + b << endl;
}
p2_11.ref.cpp
#include <iostream>
using namespace std;
void swap( int* ap, int* bp )
{
int t = *ap;
*ap = *bp;
*bp = t;
}
int main()
{
int a(5), b=7;
cout << "a = " << a << ", b = " << b << endl;
swap( &a, &b );
cout << "a = " << a << ", b = " << b << endl;
return 0;
}
p2_12.ref.cpp
#include <iostream>
using namespace std;
void swap( int* ap, int* bp )
{
int t = *ap;
*ap = *bp;
*bp = t;
}
void swap( int& a, int& b )
{
int t = a;
a = b;
b = t;
}
int main()
{
int a(5), b=7;
cout << "a = " << a << ", b = " << b << endl;
swap( &a, &b );
cout << "a = " << a << ", b = " << b << endl;
swap( a, b );
cout << "a = " << a << ", b = " << b << endl;
return 0;
}
p2_13.ref.cpp
#include <iostream>
using namespace std;
int main()
{
int a(100), b(200);
int& c(a);
cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
a = 101;
cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
c = 102;
cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
b = 201;
cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
c = b;
cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
c = 100;
cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
b = 202;
cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
return 0;
}
p2_14.const.cpp
#include <iostream>
using namespace std;
int main()
{
int a = 100;
const int b = 200;
const int* p = &a;
p = &b;
const int& r = a;
return 0;
}
p3_21.oper.cpp
#include <iostream>
using namespace std;
struct tacka
{
int x;
int y;
};
ostream& operator<<( ostream& ostr, const tacka& a )
{
ostr << "(" << a.x << "," << a.y << ")";
return ostr;
}
istream& operator>>( istream& istr, tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.x >> c2 >> a.y >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
int main()
{
tacka a = {2,5};
cout << a << endl;
cout << "Upisite tacku: ";
cin >> a;
if( !cin ){
cerr << "Greska!" << endl;
return 1;
}
cout << a << endl;
return 0;
}
p3_22.class.cpp
#include <iostream>
using namespace std;
struct tacka
{
public:
int x;
int y;
tacka( int x0, int y0 )
: x(x0), y(y0)
{}
};
ostream& operator<<( ostream& ostr, const tacka& a )
{
ostr << "(" << a.x << "," << a.y << ")";
return ostr;
}
istream& operator>>( istream& istr, tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.x >> c2 >> a.y >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
int main()
{
tacka a(2,5);
cout << a << endl;
cout << "Upisite tacku: ";
cin >> a;
if( !cin ){
cerr << "Greska!" << endl;
return 1;
}
cout << a << endl;
return 0;
}
p3_23.class.cpp
#include <iostream>
using namespace std;
struct tacka
{
public:
int x;
int y;
tacka( int x0, int y0 )
: x(x0), y(y0)
{}
};
ostream& operator<<( ostream& ostr, const tacka& a )
{
ostr << "(" << a.x << "," << a.y << ")";
return ostr;
}
istream& operator>>( istream& istr, tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.x >> c2 >> a.y >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
void automatskiPrimer()
{
tacka t(35,4);
cout << t << endl;
for( int i=0; i<3; i++ ){
tacka t1(i,i+1);
cout << t1 << endl;
}
}
void dinamickiPrimer()
{
tacka* t = new tacka(35,4);
cout << *t << endl;
delete t;
for( int i=0; i<3; i++ ){
tacka* t1 = new tacka(i,i+1);
cout << *t1 << endl;
delete t1;
}
}
int main()
{
automatskiPrimer();
dinamickiPrimer();
return 0;
}
p3_24.class.cpp
#include <iostream>
using namespace std;
class tacka
{
public:
int x;
int y;
tacka()
: x(0), y(0)
{}
tacka( int x0, int y0 )
: x(x0), y(y0)
{}
tacka( const tacka& t )
: x(t.x), y(t.y)
{}
~tacka()
{}
tacka& operator=( const tacka& t )
{
x = t.x;
y = t.y;
return *this;
}
};
ostream& operator<<( ostream& ostr, const tacka& a )
{
ostr << "(" << a.x << "," << a.y << ")";
return ostr;
}
istream& operator>>( istream& istr, tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.x >> c2 >> a.y >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
int main()
{
tacka t1(1,2);
tacka t2(3,4);
tacka niz_automatski[2];
tacka t3(t1);
for( int i=0; i<3; i++ ){
tacka t4 = t2;
}
t3 = t2;
tacka* niz_dinamicki = new tacka[3];
delete [] niz_dinamicki;
niz_dinamicki = new tacka[2];
delete niz_dinamicki;
return 0;
}
p3_25.class.cpp
#include <iostream>
using namespace std;
class tacka;
ostream& operator<<( ostream& ostr, const tacka& a );
class tacka
{
public:
int x;
int y;
tacka()
: x(0), y(0)
{
cerr << "*konstruktor bez argumenata: " << *this << endl;
}
tacka( int x0, int y0 )
: x(x0), y(y0)
{
cerr << "*konstruktor: " << *this << endl;
}
tacka( const tacka& t )
: x(t.x), y(t.y)
{
cerr << "*konstruktor kopije: " << *this << endl;
}
~tacka()
{
cerr << "*destruktor: " << *this << endl;
}
tacka& operator=( const tacka& t )
{
x = t.x;
y = t.y;
cerr << "*operator dodeljivanja: " << *this << endl;
return *this;
}
};
ostream& operator<<( ostream& ostr, const tacka& a )
{
ostr << "(" << a.x << "," << a.y << ")";
return ostr;
}
istream& operator>>( istream& istr, tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.x >> c2 >> a.y >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
int main()
{
tacka t1(1,2);
tacka t2(3,4);
tacka niz_automatski[2];
tacka t3(t1);
for( int i=0; i<3; i++ ){
tacka t4 = t2;
}
t3 = t2;
cerr << "---\n";
tacka* dinamicka_tacka = new tacka(7,8);
delete dinamicka_tacka;
cerr << "---\n";
tacka* niz_dinamicki = new tacka[3];
delete [] niz_dinamicki;
cerr << "---\n";
niz_dinamicki = new tacka[2];
delete niz_dinamicki;
return 0;
}
p3_25adv.class.cpp
#include <iostream>
using namespace std;
class tacka;
ostream& operator<<( ostream& ostr, const tacka& a );
class tacka
{
public:
int x;
int y;
tacka()
: x(0), y(0)
{
cerr << "*konstruktor bez argumenata: " << *this << endl;
}
tacka( int x0, int y0 )
: x(x0), y(y0)
{
cerr << "*konstruktor: " << *this << endl;
}
tacka( const tacka& t )
: x(t.x), y(t.y)
{
cerr << "*konstruktor kopije: " << *this << endl;
}
~tacka()
{
cerr << "*destruktor: " << *this << endl;
}
tacka& operator=( const tacka& t )
{
x = t.x;
y = t.y;
cerr << "*operator dodeljivanja: " << *this << endl;
return *this;
}
void* operator new( size_t size )
{
void* p = ::operator new( size );
cerr << "*new: " << size << " : " << p << endl;
return p;
}
void operator delete( void* p )
{
cerr << "*delete: " << p << endl;
return ::operator delete( p );
}
void* operator new[]( size_t size )
{
void* p = ::operator new[]( size );
cerr << "*new[]: " << size << " : " << p << endl;
return p;
}
void operator delete[]( void* p )
{
cerr << "*delete[]: " << p << " : " << *(long long*)p << endl;
return ::operator delete[]( p );
}
};
ostream& operator<<( ostream& ostr, const tacka& a )
{
ostr << "(" << a.x << "," << a.y << ")";
return ostr;
}
istream& operator>>( istream& istr, tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.x >> c2 >> a.y >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
int main()
{
tacka t1(1,2);
tacka t2(3,4);
tacka niz_automatski[2];
tacka t3(t1);
for( int i=0; i<3; i++ ){
tacka t4 = t2;
}
t3 = t2;
cerr << "---\n";
tacka* dinamicka_tacka = new tacka(7,8);
delete dinamicka_tacka;
cerr << "---\n";
tacka* niz_dinamicki = new tacka[3];
delete [] niz_dinamicki;
cerr << "---\n";
niz_dinamicki = new tacka[2];
delete niz_dinamicki;
return 0;
}
p3_26.class.cpp
#include <iostream>
#include <cstring>
using namespace std;
class niska
{
private:
char* tekst;
friend ostream& operator<<( ostream& ostr, const niska& n );
public:
niska( const char* s )
{
if(s){
tekst = new char[strlen(s)+1];
strcpy( tekst, s );
}else{
tekst = new char[1];
*tekst = 0;
}
}
niska( const niska& n )
{
tekst = new char[strlen(n.tekst)+1];
strcpy( tekst, n.tekst );
}
niska& operator=( const niska& n )
{
if( this != &n ){
delete [] tekst;
tekst = new char[strlen(n.tekst)+1];
strcpy( tekst, n.tekst );
}
return *this;
}
~niska()
{
cout << "*** DEL " << (void*)tekst << " " << tekst << endl;
delete [] tekst;
}
};
ostream& operator<<( ostream& ostr, const niska& n )
{
ostr << n.tekst;
return ostr;
}
int main()
{
niska s = "Zdravo!";
cout << s << endl;
niska q = "AAA";
q = s;
}
p4_02.lik.cpp
#include <iostream>
using namespace std;
class Tacka
{
public:
Tacka( double x, double y )
: X_(x), Y_(y)
{}
private:
double X_;
double Y_;
friend ostream& operator<<( ostream&, const Tacka& );
friend istream& operator>>( istream&, Tacka& );
};
ostream& operator<<( ostream& ostr, const Tacka& t )
{
ostr << "(" << t.X_ << "," << t.Y_ << ")";
return ostr;
}
istream& operator>>( istream& istr, Tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.X_ >> c2 >> a.Y_ >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
int main()
{
Tacka t(20,15);
cout << t << endl;
return 0;
}
p4_06.lik.cpp
#include <iostream>
using namespace std;
class Tacka
{
public:
Tacka( double x, double y )
: X_(x), Y_(y)
{}
private:
double X_;
double Y_;
friend ostream& operator<<( ostream&, const Tacka& );
friend istream& operator>>( istream&, Tacka& );
};
ostream& operator<<( ostream& ostr, const Tacka& t )
{
ostr << "(" << t.X_ << "," << t.Y_ << ")";
return ostr;
}
istream& operator>>( istream& istr, Tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.X_ >> c2 >> a.Y_ >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
class Lik
{
public:
Lik( double x, double y )
: Polozaj_(x,y)
{}
const Tacka& Polozaj() const
{ return Polozaj_; }
Tacka& Polozaj()
{ return Polozaj_; }
private:
Tacka Polozaj_;
};
class Pravougaonik : public Lik
{
public:
Pravougaonik( double x, double y, double s, double v )
: Lik(x,y), Sirina_(s), Visina_(v)
{}
double Sirina() const
{ return Sirina_; }
double Visina() const
{ return Visina_; }
private:
double Sirina_;
double Visina_;
};
class Kvadrat : public Pravougaonik
{
public:
Kvadrat( double x, double y, double a )
: Pravougaonik( x, y, a, a )
{}
};
class Krug : public Lik
{
public:
Krug( double x, double y, double r )
: Lik(x,y), R_(r)
{}
double R() const
{ return R_; }
private:
double R_;
};
int main()
{
Tacka t(20,15);
cout << t << endl;
Pravougaonik p(1,2,3,4);
cout << p.Polozaj() << " : " << p.Sirina() << ',' << p.Visina() << endl;
Kvadrat kv(1,2,3);
cout << kv.Polozaj() << " : " << kv.Sirina() << ',' << kv.Visina() << endl;
Krug k(1,2,3);
cout << k.Polozaj() << " : " << k.R() << endl;
return 0;
}
p5_12.virtual.cpp
#define _USE_MATH_DEFINES
#include <cmath>
#include <iostream>
using namespace std;
class Tacka
{
public:
Tacka( double x, double y )
: X_(x), Y_(y)
{}
private:
double X_;
double Y_;
friend ostream& operator<<( ostream&, const Tacka& );
friend istream& operator>>( istream&, Tacka& );
};
ostream& operator<<( ostream& ostr, const Tacka& t )
{
ostr << "(" << t.X_ << "," << t.Y_ << ")";
return ostr;
}
istream& operator>>( istream& istr, Tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.X_ >> c2 >> a.Y_ >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
class Lik
{
public:
Lik( double x, double y )
: Polozaj_(x,y)
{}
const Tacka& Polozaj() const
{ return Polozaj_; }
double Povrsina() const
{ return 0; }
private:
Tacka Polozaj_;
};
class Pravougaonik : public Lik
{
public:
Pravougaonik( double x, double y, double s, double v )
: Lik(x,y), Sirina_(s), Visina_(v)
{}
double Sirina() const
{ return Sirina_; }
double Visina() const
{ return Visina_; }
double Povrsina() const
{ return Sirina() * Visina(); }
private:
double Sirina_;
double Visina_;
};
class Kvadrat : public Pravougaonik
{
public:
Kvadrat( double x, double y, double a )
: Pravougaonik( x, y, a, a )
{}
};
class Krug : public Lik
{
public:
Krug( double x, double y, double r )
: Lik(x,y), R_(r)
{}
double R() const
{ return R_; }
double Povrsina() const
{ return R() * R() * M_PI; }
private:
double R_;
};
void OpisiLik( ostream& ostr, const Lik& lik )
{
ostr << lik.Polozaj() << " : " << lik.Povrsina() << endl;
}
int main()
{
Pravougaonik p(1,2,3,4);
cout << p.Polozaj() << " : " << p.Povrsina()
<< " : " << p.Sirina() << ',' << p.Visina() << endl;
OpisiLik( cout, p );
Kvadrat kv(1,2,3);
cout << kv.Polozaj() << " : " << kv.Povrsina()
<< " : " << kv.Sirina() << ',' << kv.Visina() << endl;
OpisiLik( cout, kv );
Krug k(1,2,3);
cout << k.Polozaj() << " : " << k.Povrsina()
<< " : " << k.R() << endl;
OpisiLik( cout, k );
return 0;
}
p5_13.virtual.cpp
#define _USE_MATH_DEFINES
#include <cmath>
#include <iostream>
using namespace std;
class Tacka
{
public:
Tacka( double x, double y )
: X_(x), Y_(y)
{}
private:
double X_;
double Y_;
friend ostream& operator<<( ostream&, const Tacka& );
friend istream& operator>>( istream&, Tacka& );
};
ostream& operator<<( ostream& ostr, const Tacka& t )
{
ostr << "(" << t.X_ << "," << t.Y_ << ")";
return ostr;
}
istream& operator>>( istream& istr, Tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.X_ >> c2 >> a.Y_ >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
class Lik
{
public:
Lik( double x, double y )
: Polozaj_(x,y)
{}
const Tacka& Polozaj() const
{ return Polozaj_; }
virtual double Povrsina() const = 0;
private:
Tacka Polozaj_;
};
class Pravougaonik : public Lik
{
public:
Pravougaonik( double x, double y, double s, double v )
: Lik(x,y), Sirina_(s), Visina_(v)
{}
double Sirina() const
{ return Sirina_; }
double Visina() const
{ return Visina_; }
double Povrsina() const override
{ return Sirina() * Visina(); }
private:
double Sirina_;
double Visina_;
};
class Kvadrat : public Pravougaonik
{
public:
Kvadrat( double x, double y, double a )
: Pravougaonik( x, y, a, a )
{}
};
class Krug : public Lik
{
public:
Krug( double x, double y, double r )
: Lik(x,y), R_(r)
{}
double R() const
{ return R_; }
double Povrsina() const override
{ return R() * R() * M_PI; }
private:
double R_;
};
void OpisiLik( ostream& ostr, const Lik& lik )
{
ostr << lik.Polozaj() << " : " << lik.Povrsina() << endl;
}
int main()
{
Pravougaonik p(1,2,3,4);
cout << p.Polozaj() << " : " << p.Povrsina()
<< " : " << p.Sirina() << ',' << p.Visina() << endl;
OpisiLik( cout, p );
Kvadrat kv(1,2,3);
cout << kv.Polozaj() << " : " << kv.Povrsina()
<< " : " << kv.Sirina() << ',' << kv.Visina() << endl;
OpisiLik( cout, kv );
Krug k(1,2,3);
cout << k.Polozaj() << " : " << k.Povrsina()
<< " : " << k.R() << endl;
OpisiLik( cout, k );
return 0;
}
p5_14.virtual.cpp
#define _USE_MATH_DEFINES
#include <cmath>
#include <iostream>
using namespace std;
class Tacka
{
public:
Tacka( double x, double y )
: X_(x), Y_(y)
{}
private:
double X_;
double Y_;
friend ostream& operator<<( ostream&, const Tacka& );
friend istream& operator>>( istream&, Tacka& );
};
ostream& operator<<( ostream& ostr, const Tacka& t )
{
ostr << "(" << t.X_ << "," << t.Y_ << ")";
return ostr;
}
istream& operator>>( istream& istr, Tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.X_ >> c2 >> a.Y_ >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
class Lik
{
public:
Lik( double x, double y )
: Polozaj_(x,y)
{}
const Tacka& Polozaj() const
{ return Polozaj_; }
virtual double Povrsina() const = 0;
virtual const char* NazivKlase() const = 0;
virtual void Ispisi( ostream& ostr ) const
{
ostr << NazivKlase() << Polozaj() << " : P=" << Povrsina();
}
private:
Tacka Polozaj_;
};
ostream& operator<<( ostream& ostr, const Lik& lik )
{
lik.Ispisi(ostr);
return ostr;
}
class Pravougaonik : public Lik
{
public:
Pravougaonik( double x, double y, double s, double v )
: Lik(x,y), Sirina_(s), Visina_(v)
{}
double Sirina() const
{ return Sirina_; }
double Visina() const
{ return Visina_; }
const char* NazivKlase() const override
{ return "Pravougaonik"; }
double Povrsina() const override
{ return Sirina() * Visina(); }
void Ispisi( ostream& ostr ) const override
{
Lik::Ispisi(ostr);
ostr << " : a,b=" << Sirina() << "," << Visina();
}
private:
double Sirina_;
double Visina_;
};
class Kvadrat : public Pravougaonik
{
public:
Kvadrat( double x, double y, double a )
: Pravougaonik( x, y, a, a )
{}
const char* NazivKlase() const override
{ return "Kvadrat"; }
};
class Krug : public Lik
{
public:
Krug( double x, double y, double r )
: Lik(x,y), R_(r)
{}
double R() const
{ return R_; }
const char* NazivKlase() const override
{ return "Krug"; }
double Povrsina() const override
{ return R() * R() * M_PI; }
void Ispisi( ostream& ostr ) const override
{
Lik::Ispisi(ostr);
ostr << " : r=" << R();
}
private:
double R_;
};
int main()
{
Pravougaonik p(1,2,3,4);
cout << p.Polozaj() << " : " << p.Povrsina()
<< " : " << p.Sirina() << ',' << p.Visina() << endl;
cout << p << endl;
Kvadrat kv(1,2,3);
cout << kv.Polozaj() << " : " << kv.Povrsina()
<< " : " << kv.Sirina() << ',' << kv.Visina() << endl;
cout << kv << endl;
Krug k(1,2,3);
cout << k.Polozaj() << " : " << k.Povrsina()
<< " : " << k.R() << endl;
cout << k << endl;
return 0;
}
p6_31.niz.cpp
#define _USE_MATH_DEFINES
#include <cmath>
#include <iostream>
using namespace std;
namespace Geometrija {
class Tacka
{
public:
Tacka( double x, double y )
: X_(x), Y_(y)
{}
private:
double X_;
double Y_;
friend ostream& operator<<( ostream&, const Tacka& );
friend istream& operator>>( istream&, Tacka& );
};
ostream& operator<<( ostream& ostr, const Tacka& t )
{
ostr << "(" << t.X_ << "," << t.Y_ << ")";
return ostr;
}
istream& operator>>( istream& istr, Tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.X_ >> c2 >> a.Y_ >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
class Lik
{
public:
Lik( double x, double y )
: Polozaj_(x,y)
{}
const Tacka& Polozaj() const
{ return Polozaj_; }
virtual double Povrsina() const = 0;
virtual const char* NazivKlase() const = 0;
virtual void Ispisi( ostream& ostr ) const {
ostr << NazivKlase() << Polozaj() << " : P=" << Povrsina();
}
private:
Tacka Polozaj_;
};
ostream& operator<<( ostream& ostr, const Lik& lik )
{
lik.Ispisi(ostr);
return ostr;
}
class Pravougaonik : public Lik
{
public:
Pravougaonik( double x, double y, double s, double v )
: Lik(x,y), Sirina_(s), Visina_(v)
{}
double Sirina() const
{ return Sirina_; }
double Visina() const
{ return Visina_; }
const char* NazivKlase() const override
{ return "Pravougaonik"; }
double Povrsina() const override
{ return Sirina() * Visina(); }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : a,b=" << Sirina() << "," << Visina();
}
private:
double Sirina_;
double Visina_;
};
class Kvadrat : public Pravougaonik
{
public:
Kvadrat( double x, double y, double a )
: Pravougaonik( x, y, a, a )
{}
const char* NazivKlase() const override
{ return "Kvadrat"; }
};
class Krug : public Lik
{
public:
Krug( double x, double y, double r )
: Lik(x,y), R_(r)
{}
double R() const
{ return R_; }
const char* NazivKlase() const override
{ return "Krug"; }
double Povrsina() const override
{ return R() * R() * M_PI; }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : r=" << R();
}
private:
double R_;
};
}
using namespace Geometrija;
int main()
{
Lik niz[3] = {
Pravougaonik(1,2,3,4),
Kvadrat(1,2,3),
Krug(8,9,10)
};
for( unsigned i=0; i<3; i++ )
cout << niz[i] << endl;
return 0;
}
p6_33.niz.cpp
#define _USE_MATH_DEFINES
#include <cmath>
#include <iostream>
using namespace std;
namespace Geometrija {
class Tacka
{
public:
Tacka( double x, double y )
: X_(x), Y_(y)
{}
private:
double X_;
double Y_;
friend ostream& operator<<( ostream&, const Tacka& );
friend istream& operator>>( istream&, Tacka& );
};
ostream& operator<<( ostream& ostr, const Tacka& t )
{
ostr << "(" << t.X_ << "," << t.Y_ << ")";
return ostr;
}
istream& operator>>( istream& istr, Tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.X_ >> c2 >> a.Y_ >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
class Lik
{
public:
Lik( double x, double y )
: Polozaj_(x,y)
{}
virtual ~Lik()
{}
const Tacka& Polozaj() const
{ return Polozaj_; }
virtual double Povrsina() const = 0;
virtual const char* NazivKlase() const = 0;
virtual void Ispisi( ostream& ostr ) const {
ostr << NazivKlase() << Polozaj() << " : P=" << Povrsina();
}
private:
Tacka Polozaj_;
};
ostream& operator<<( ostream& ostr, const Lik& lik )
{
lik.Ispisi(ostr);
return ostr;
}
class Pravougaonik : public Lik
{
public:
Pravougaonik( double x, double y, double s, double v )
: Lik(x,y), Sirina_(s), Visina_(v)
{}
double Sirina() const
{ return Sirina_; }
double Visina() const
{ return Visina_; }
const char* NazivKlase() const override
{ return "Pravougaonik"; }
double Povrsina() const override
{ return Sirina() * Visina(); }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : a,b=" << Sirina() << "," << Visina();
}
private:
double Sirina_;
double Visina_;
};
class Kvadrat : public Pravougaonik
{
public:
Kvadrat( double x, double y, double a )
: Pravougaonik( x, y, a, a )
{}
const char* NazivKlase() const override
{ return "Kvadrat"; }
};
class Krug : public Lik
{
public:
Krug( double x, double y, double r )
: Lik(x,y), R_(r)
{}
double R() const
{ return R_; }
const char* NazivKlase() const override
{ return "Krug"; }
double Povrsina() const override
{ return R() * R() * M_PI; }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : r=" << R();
}
private:
double R_;
};
}
using namespace Geometrija;
int main()
{
Lik* niz[3] = {
new Pravougaonik(1,2,3,4),
new Kvadrat(1,2,3),
new Krug(8,9,10)
};
for( unsigned i=0; i<3; i++ )
cout << *niz[i] << endl;
for( unsigned i=0; i<3; i++ )
delete niz[i];
return 0;
}
p7_41.iter.cpp
#define _USE_MATH_DEFINES
#include <cmath>
#include <vector>
#include <iostream>
using namespace std;
namespace Geometrija {
class Tacka
{
public:
Tacka( double x, double y )
: X_(x), Y_(y)
{}
private:
double X_;
double Y_;
friend ostream& operator<<( ostream&, const Tacka& );
friend istream& operator>>( istream&, Tacka& );
};
ostream& operator<<( ostream& ostr, const Tacka& t )
{
ostr << "(" << t.X_ << "," << t.Y_ << ")";
return ostr;
}
istream& operator>>( istream& istr, Tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.X_ >> c2 >> a.Y_ >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
class Lik
{
public:
Lik( double x, double y )
: Polozaj_(x,y)
{}
virtual ~Lik()
{}
const Tacka& Polozaj() const
{ return Polozaj_; }
virtual double Povrsina() const = 0;
virtual const char* NazivKlase() const = 0;
virtual void Ispisi( ostream& ostr ) const {
ostr << NazivKlase() << Polozaj() << " : P=" << Povrsina();
}
private:
Tacka Polozaj_;
};
ostream& operator<<( ostream& ostr, const Lik& lik )
{
lik.Ispisi(ostr);
return ostr;
}
class Pravougaonik : public Lik
{
public:
Pravougaonik( double x, double y, double s, double v )
: Lik(x,y), Sirina_(s), Visina_(v)
{}
double Sirina() const
{ return Sirina_; }
double Visina() const
{ return Visina_; }
const char* NazivKlase() const override
{ return "Pravougaonik"; }
double Povrsina() const override
{ return Sirina() * Visina(); }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : a,b=" << Sirina() << "," << Visina();
}
private:
double Sirina_;
double Visina_;
};
class Kvadrat : public Pravougaonik
{
public:
Kvadrat( double x, double y, double a )
: Pravougaonik( x, y, a, a )
{}
const char* NazivKlase() const override
{ return "Kvadrat"; }
};
class Krug : public Lik
{
public:
Krug( double x, double y, double r )
: Lik(x,y), R_(r)
{}
double R() const
{ return R_; }
const char* NazivKlase() const override
{ return "Krug"; }
double Povrsina() const override
{ return R() * R() * M_PI; }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : r=" << R();
}
private:
double R_;
};
}
using namespace Geometrija;
int main()
{
vector<Lik*> niz;
niz.push_back( new Pravougaonik(1,2,3,4) );
niz.push_back( new Kvadrat(1,2,3) );
niz.push_back( new Krug(8,9,10) );
for( unsigned i=0; i<niz.size(); i++ )
cout << *niz[i] << endl;
for( unsigned i=0; i<niz.size(); i++ )
delete niz[i];
return 0;
}
p7_42.iter.cpp
#define _USE_MATH_DEFINES
#include <cmath>
#include <vector>
#include <iostream>
using namespace std;
namespace Geometrija {
class Tacka
{
public:
Tacka( double x, double y )
: X_(x), Y_(y)
{}
private:
double X_;
double Y_;
friend ostream& operator<<( ostream&, const Tacka& );
friend istream& operator>>( istream&, Tacka& );
};
ostream& operator<<( ostream& ostr, const Tacka& t )
{
ostr << "(" << t.X_ << "," << t.Y_ << ")";
return ostr;
}
istream& operator>>( istream& istr, Tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.X_ >> c2 >> a.Y_ >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
class Lik
{
public:
Lik( double x, double y )
: Polozaj_(x,y)
{}
virtual ~Lik()
{}
const Tacka& Polozaj() const
{ return Polozaj_; }
virtual double Povrsina() const = 0;
virtual const char* NazivKlase() const = 0;
virtual void Ispisi( ostream& ostr ) const {
ostr << NazivKlase() << Polozaj() << " : P=" << Povrsina();
}
private:
Tacka Polozaj_;
};
ostream& operator<<( ostream& ostr, const Lik& lik )
{
lik.Ispisi(ostr);
return ostr;
}
class Pravougaonik : public Lik
{
public:
Pravougaonik( double x, double y, double s, double v )
: Lik(x,y), Sirina_(s), Visina_(v)
{}
double Sirina() const
{ return Sirina_; }
double Visina() const
{ return Visina_; }
const char* NazivKlase() const override
{ return "Pravougaonik"; }
double Povrsina() const override
{ return Sirina() * Visina(); }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : a,b=" << Sirina() << "," << Visina();
}
private:
double Sirina_;
double Visina_;
};
class Kvadrat : public Pravougaonik
{
public:
Kvadrat( double x, double y, double a )
: Pravougaonik( x, y, a, a )
{}
const char* NazivKlase() const override
{ return "Kvadrat"; }
};
class Krug : public Lik
{
public:
Krug( double x, double y, double r )
: Lik(x,y), R_(r)
{}
double R() const
{ return R_; }
const char* NazivKlase() const override
{ return "Krug"; }
double Povrsina() const override
{ return R() * R() * M_PI; }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : r=" << R();
}
private:
double R_;
};
}
using namespace Geometrija;
int main()
{
vector<Lik*> niz;
niz.push_back( new Pravougaonik(1,2,3,4) );
niz.push_back( new Kvadrat(1,2,3) );
niz.push_back( new Krug(8,9,10) );
Lik** prvi = niz.data();
Lik** izaPoslednjeg = niz.data() + niz.size();
for( Lik** i=prvi; i<izaPoslednjeg; i++ )
cout << **i << endl;
for( Lik** i=prvi; i<izaPoslednjeg; i++ )
delete *i;
return 0;
}
p7_43.iter.cpp
#define _USE_MATH_DEFINES
#include <cmath>
#include <vector>
#include <iostream>
using namespace std;
namespace Geometrija {
class Tacka
{
public:
Tacka( double x, double y )
: X_(x), Y_(y)
{}
private:
double X_;
double Y_;
friend ostream& operator<<( ostream&, const Tacka& );
friend istream& operator>>( istream&, Tacka& );
};
ostream& operator<<( ostream& ostr, const Tacka& t )
{
ostr << "(" << t.X_ << "," << t.Y_ << ")";
return ostr;
}
istream& operator>>( istream& istr, Tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.X_ >> c2 >> a.Y_ >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
class Lik
{
public:
Lik( double x, double y )
: Polozaj_(x,y)
{}
virtual ~Lik()
{}
const Tacka& Polozaj() const
{ return Polozaj_; }
virtual double Povrsina() const = 0;
virtual const char* NazivKlase() const = 0;
virtual void Ispisi( ostream& ostr ) const {
ostr << NazivKlase() << Polozaj() << " : P=" << Povrsina();
}
private:
Tacka Polozaj_;
};
ostream& operator<<( ostream& ostr, const Lik& lik )
{
lik.Ispisi(ostr);
return ostr;
}
class Pravougaonik : public Lik
{
public:
Pravougaonik( double x, double y, double s, double v )
: Lik(x,y), Sirina_(s), Visina_(v)
{}
double Sirina() const
{ return Sirina_; }
double Visina() const
{ return Visina_; }
const char* NazivKlase() const override
{ return "Pravougaonik"; }
double Povrsina() const override
{ return Sirina() * Visina(); }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : a,b=" << Sirina() << "," << Visina();
}
private:
double Sirina_;
double Visina_;
};
class Kvadrat : public Pravougaonik
{
public:
Kvadrat( double x, double y, double a )
: Pravougaonik( x, y, a, a )
{}
const char* NazivKlase() const override
{ return "Kvadrat"; }
};
class Krug : public Lik
{
public:
Krug( double x, double y, double r )
: Lik(x,y), R_(r)
{}
double R() const
{ return R_; }
const char* NazivKlase() const override
{ return "Krug"; }
double Povrsina() const override
{ return R() * R() * M_PI; }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : r=" << R();
}
private:
double R_;
};
}
using namespace Geometrija;
int main()
{
vector<Lik*> niz;
niz.push_back( new Pravougaonik(1,2,3,4) );
niz.push_back( new Kvadrat(1,2,3) );
niz.push_back( new Krug(8,9,10) );
vector<Lik*>::iterator
prvi = niz.begin(),
izaPoslednjeg = niz.end();
for( vector<Lik*>::iterator i=prvi; i!=izaPoslednjeg; i++ )
cout << **i << endl;
for( vector<Lik*>::iterator i=prvi; i!=izaPoslednjeg; i++ )
delete *i;
return 0;
}
p7_44.iter.cpp
#define _USE_MATH_DEFINES
#include <cmath>
#include <vector>
#include <iostream>
using namespace std;
namespace Geometrija {
class Tacka
{
public:
Tacka( double x, double y )
: X_(x), Y_(y)
{}
private:
double X_;
double Y_;
friend ostream& operator<<( ostream&, const Tacka& );
friend istream& operator>>( istream&, Tacka& );
};
ostream& operator<<( ostream& ostr, const Tacka& t )
{
ostr << "(" << t.X_ << "," << t.Y_ << ")";
return ostr;
}
istream& operator>>( istream& istr, Tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.X_ >> c2 >> a.Y_ >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
class Lik
{
public:
Lik( double x, double y )
: Polozaj_(x,y)
{}
virtual ~Lik()
{}
const Tacka& Polozaj() const
{ return Polozaj_; }
virtual double Povrsina() const = 0;
virtual const char* NazivKlase() const = 0;
virtual void Ispisi( ostream& ostr ) const {
ostr << NazivKlase() << Polozaj() << " : P=" << Povrsina();
}
private:
Tacka Polozaj_;
};
ostream& operator<<( ostream& ostr, const Lik& lik )
{
lik.Ispisi(ostr);
return ostr;
}
class Pravougaonik : public Lik
{
public:
Pravougaonik( double x, double y, double s, double v )
: Lik(x,y), Sirina_(s), Visina_(v)
{}
double Sirina() const
{ return Sirina_; }
double Visina() const
{ return Visina_; }
const char* NazivKlase() const override
{ return "Pravougaonik"; }
double Povrsina() const override
{ return Sirina() * Visina(); }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : a,b=" << Sirina() << "," << Visina();
}
private:
double Sirina_;
double Visina_;
};
class Kvadrat : public Pravougaonik
{
public:
Kvadrat( double x, double y, double a )
: Pravougaonik( x, y, a, a )
{}
const char* NazivKlase() const override
{ return "Kvadrat"; }
};
class Krug : public Lik
{
public:
Krug( double x, double y, double r )
: Lik(x,y), R_(r)
{}
double R() const
{ return R_; }
const char* NazivKlase() const override
{ return "Krug"; }
double Povrsina() const override
{ return R() * R() * M_PI; }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : r=" << R();
}
private:
double R_;
};
}
using namespace Geometrija;
int main()
{
vector<Lik*> niz;
niz.push_back( new Pravougaonik(1,2,3,4) );
niz.push_back( new Kvadrat(1,2,3) );
niz.push_back( new Krug(8,9,10) );
auto prvi = niz.begin(),
izaPoslednjeg = niz.end();
for( auto i=prvi; i!=izaPoslednjeg; i++ )
cout << **i << endl;
for( auto i=prvi; i!=izaPoslednjeg; i++ )
delete *i;
return 0;
}
p7_45.iter.cpp
#define _USE_MATH_DEFINES
#include <cmath>
#include <vector>
#include <iostream>
using namespace std;
namespace Geometrija {
class Tacka
{
public:
Tacka( double x, double y )
: X_(x), Y_(y)
{}
private:
double X_;
double Y_;
friend ostream& operator<<( ostream&, const Tacka& );
friend istream& operator>>( istream&, Tacka& );
};
ostream& operator<<( ostream& ostr, const Tacka& t )
{
ostr << "(" << t.X_ << "," << t.Y_ << ")";
return ostr;
}
istream& operator>>( istream& istr, Tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.X_ >> c2 >> a.Y_ >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
class Lik
{
public:
Lik( double x, double y )
: Polozaj_(x,y)
{}
virtual ~Lik()
{}
const Tacka& Polozaj() const
{ return Polozaj_; }
virtual double Povrsina() const = 0;
virtual const char* NazivKlase() const = 0;
virtual void Ispisi( ostream& ostr ) const {
ostr << NazivKlase() << Polozaj() << " : P=" << Povrsina();
}
private:
Tacka Polozaj_;
};
ostream& operator<<( ostream& ostr, const Lik& lik )
{
lik.Ispisi(ostr);
return ostr;
}
class Pravougaonik : public Lik
{
public:
Pravougaonik( double x, double y, double s, double v )
: Lik(x,y), Sirina_(s), Visina_(v)
{}
double Sirina() const
{ return Sirina_; }
double Visina() const
{ return Visina_; }
const char* NazivKlase() const override
{ return "Pravougaonik"; }
double Povrsina() const override
{ return Sirina() * Visina(); }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : a,b=" << Sirina() << "," << Visina();
}
private:
double Sirina_;
double Visina_;
};
class Kvadrat : public Pravougaonik
{
public:
Kvadrat( double x, double y, double a )
: Pravougaonik( x, y, a, a )
{}
const char* NazivKlase() const override
{ return "Kvadrat"; }
};
class Krug : public Lik
{
public:
Krug( double x, double y, double r )
: Lik(x,y), R_(r)
{}
double R() const
{ return R_; }
const char* NazivKlase() const override
{ return "Krug"; }
double Povrsina() const override
{ return R() * R() * M_PI; }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : r=" << R();
}
private:
double R_;
};
}
using namespace Geometrija;
int main()
{
vector<Lik*> niz;
niz.push_back( new Pravougaonik(1,2,3,4) );
niz.push_back( new Kvadrat(1,2,3) );
niz.push_back( new Krug(8,9,10) );
for( Lik* lik : niz )
cout << *lik << endl;
for( auto lik : niz )
delete lik;
return 0;
}
p8_61.composite.cpp
#define _USE_MATH_DEFINES
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
namespace Geometrija {
class Tacka
{
public:
Tacka( double x, double y )
: X_(x), Y_(y)
{}
~Tacka() {
cout << "~Tacka " << *this << endl;
}
private:
double X_;
double Y_;
friend ostream& operator<<( ostream&, const Tacka& );
friend istream& operator>>( istream&, Tacka& );
};
ostream& operator<<( ostream& ostr, const Tacka& t )
{
ostr << "(" << t.X_ << "," << t.Y_ << ")";
return ostr;
}
istream& operator>>( istream& istr, Tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.X_ >> c2 >> a.Y_ >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
class Lik
{
public:
Lik( double x, double y )
: Polozaj_(x,y)
{ BrojLikova_++; }
Lik( const Lik& lik )
: Polozaj_( lik.Polozaj_ )
{ BrojLikova_++; }
virtual ~Lik() {
cout << "~Lik" << endl;
BrojLikova_--;
}
const Tacka& Polozaj() const
{ return Polozaj_; }
virtual double Povrsina() const = 0;
virtual const char* NazivKlase() const = 0;
virtual void Ispisi( ostream& ostr ) const {
ostr << NazivKlase() << Polozaj() << " : P=" << Povrsina();
}
static unsigned BrojLikova_;
static unsigned BrojLikova()
{ return BrojLikova_; }
private:
Tacka Polozaj_;
};
unsigned Lik::BrojLikova_ = 0;
ostream& operator<<( ostream& ostr, const Lik& lik )
{
lik.Ispisi(ostr);
return ostr;
}
class Pravougaonik : public Lik
{
public:
Pravougaonik( double x, double y, double s, double v )
: Lik(x,y), Sirina_(s), Visina_(v)
{}
~Pravougaonik() {
cout << "~Pravougaonik" << endl;
}
double Sirina() const
{ return Sirina_; }
double Visina() const
{ return Visina_; }
const char* NazivKlase() const override
{ return "Pravougaonik"; }
double Povrsina() const override
{ return Sirina() * Visina(); }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : a,b=" << Sirina() << "," << Visina();
}
private:
double Sirina_;
double Visina_;
};
class Kvadrat : public Pravougaonik
{
public:
Kvadrat( double x, double y, double a )
: Pravougaonik( x, y, a, a )
{}
~Kvadrat() {
cout << "~Kvadrat" << endl;
}
const char* NazivKlase() const override
{ return "Kvadrat"; }
};
class Krug : public Lik
{
public:
Krug( double x, double y, double r )
: Lik(x,y), R_(r)
{}
~Krug() {
cout << "~Krug" << endl;
}
double R() const
{ return R_; }
const char* NazivKlase() const override
{ return "Krug"; }
double Povrsina() const override
{ return R() * R() * M_PI; }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : r=" << R();
}
private:
double R_;
};
class SlozenLik : public Lik
{
public:
SlozenLik( double x, double y )
: Lik(x,y)
{}
~SlozenLik() {
cout << "~SlozenLik" << endl;
for( auto lik: Likovi_ )
delete lik;
}
void Dodaj( Lik* l )
{ Likovi_.push_back(l); }
double Povrsina() const override {
double p = 0;
for( auto lik: Likovi_ )
p += lik->Povrsina();
return p;
}
const char* NazivKlase() const override
{ return "SlozenLik"; }
private:
vector<Lik*> Likovi_;
};
}
using namespace Geometrija;
int main()
{
{
SlozenLik sl(0,0);
sl.Dodaj( new Pravougaonik(1,2,3,4) );
sl.Dodaj( new Kvadrat(5,6,7) );
sl.Dodaj( new Krug(8,9,10) );
SlozenLik* sl2 = new SlozenLik(1,1);
sl2->Dodaj( new Krug(2,3,4));
sl2->Dodaj( new Kvadrat(2,4,5));
sl.Dodaj(sl2);
cout << sl << endl;
cout << Lik::BrojLikova() << endl;
}
cout << Lik::BrojLikova() << endl;
return 0;
}
p8_62.composite.cpp
#define _USE_MATH_DEFINES
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
namespace Geometrija {
class Tacka
{
public:
Tacka( double x, double y )
: X_(x), Y_(y)
{}
~Tacka() {
cout << "~Tacka " << *this << endl;
}
private:
double X_;
double Y_;
friend ostream& operator<<( ostream&, const Tacka& );
friend istream& operator>>( istream&, Tacka& );
};
ostream& operator<<( ostream& ostr, const Tacka& t )
{
ostr << "(" << t.X_ << "," << t.Y_ << ")";
return ostr;
}
istream& operator>>( istream& istr, Tacka& a )
{
char c1,c2,c3;
istr >> c1 >> a.X_ >> c2 >> a.Y_ >> c3;
if( c1!='(' || c2!=',' || c3!=')' )
istr.setstate( ios::failbit );
return istr;
}
class Lik
{
public:
Lik( double x, double y )
: Polozaj_(x,y)
{ BrojLikova++; }
Lik( const Lik& l )
: Polozaj_( l.Polozaj() )
{ BrojLikova++; }
virtual ~Lik() {
cout << "~Lik" << endl;
BrojLikova--;
}
virtual Lik* Kopija() const = 0;
Tacka& Polozaj()
{ return Polozaj_; }
const Tacka& Polozaj() const
{ return Polozaj_; }
virtual double Povrsina() const = 0;
virtual const char* NazivKlase() const = 0;
virtual void Ispisi( ostream& ostr ) const {
ostr << NazivKlase() << Polozaj() << " : P=" << Povrsina();
}
static unsigned BrojLikova;
private:
Tacka Polozaj_;
};
unsigned Lik::BrojLikova = 0;
ostream& operator<<( ostream& ostr, const Lik& lik )
{
lik.Ispisi(ostr);
return ostr;
}
class Pravougaonik : public Lik
{
public:
Pravougaonik( double x, double y, double s, double v )
: Lik(x,y), Sirina_(s), Visina_(v)
{}
~Pravougaonik() {
cout << "~Pravougaonik" << endl;
}
Lik* Kopija() const override
{ return new Pravougaonik(*this); }
double Sirina() const
{ return Sirina_; }
double Visina() const
{ return Visina_; }
const char* NazivKlase() const override
{ return "Pravougaonik"; }
double Povrsina() const override
{ return Sirina() * Visina(); }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : a,b=" << Sirina() << "," << Visina();
}
private:
double Sirina_;
double Visina_;
};
class Kvadrat : public Pravougaonik
{
public:
Kvadrat( double x, double y, double a )
: Pravougaonik( x, y, a, a )
{}
~Kvadrat() {
cout << "~Kvadrat" << endl;
}
Lik* Kopija() const override
{ return new Kvadrat(*this); }
const char* NazivKlase() const override
{ return "Kvadrat"; }
};
class Krug : public Lik
{
public:
Krug( double x, double y, double r )
: Lik(x,y), R_(r)
{}
~Krug() {
cout << "~Krug" << endl;
}
Lik* Kopija() const override
{ return new Krug(*this); }
double R() const
{ return R_; }
const char* NazivKlase() const override
{ return "Krug"; }
double Povrsina() const override
{ return R() * R() * M_PI; }
void Ispisi( ostream& ostr ) const override {
Lik::Ispisi(ostr);
ostr << " : r=" << R();
}
private:
double R_;
};
class SlozenLik : public Lik
{
public:
SlozenLik( double x, double y )
: Lik(x,y)
{}
SlozenLik( const SlozenLik& sl )
: Lik(sl)
{ init( sl ); }
~SlozenLik() {
cout << "~SlozenLik" << endl;
deinit();
}
SlozenLik& operator=( const SlozenLik& sl ) {
if( &sl != this ){
deinit();
Polozaj() = sl.Polozaj();
init(sl);
}
return *this;
}
Lik* Kopija() const override
{ return new SlozenLik(*this); }
void Dodaj( Lik* l )
{ Likovi_.push_back(l); }
double Povrsina() const override {
double p = 0;
for( auto lik: Likovi_ )
p += lik->Povrsina();
return p;
}
const char* NazivKlase() const override
{ return "SlozenLik"; }
private:
void deinit() {
for( auto lik: Likovi_ )
delete lik;
Likovi_.clear();
}
void init( const SlozenLik& sl ) {
for( auto lik: sl.Likovi_ )
Dodaj( lik->Kopija() );
}
vector<Lik*> Likovi_;
};
}
using namespace Geometrija;
int main()
{
cout << "Broj likova = " << Lik::BrojLikova << endl;
{
SlozenLik sl(0,0);
sl.Dodaj( new Pravougaonik(1,2,3,4) );
sl.Dodaj( new Kvadrat(5,6,7) );
sl.Dodaj( new Krug(8,9,10) );
SlozenLik* sl2 = new SlozenLik(1,1);
sl2->Dodaj( new Krug(2,3,4));
sl2->Dodaj( new Kvadrat(2,4,5));
sl.Dodaj(sl2);
cout << sl << endl;
cout << "Broj likova = " << Lik::BrojLikova << endl;
SlozenLik sl3 = sl;
cout << sl3 << endl;
cout << sl << endl;
cout << "Broj likova = " << Lik::BrojLikova << endl;
SlozenLik sl4 = sl;
cout << sl4 << endl;
sl4 = sl3;
cout << sl4 << endl;
cout << "Broj likova = " << Lik::BrojLikova << endl;
}
cout << "Broj likova = " << Lik::BrojLikova << endl;
return 0;
}